// 数组合并与拆分

/**
 * 语法：let new_array = concat(old_array, value[,value2[,...[,valueN]]])
 * 功能：将 n 个数组或值与当前数组合并成一个新数组
 * @param {Array} arr 第一个参数
 * @param  {...any} args 后面几个参数
 * @returns 
 */
export function concat(arr, ...args) {
  const result = [...arr];
  args.forEach(item => {
    if (Array.isArray(item)) {
      result.push(...item);
    } else {
      result.push(item);
    }
  })
  return result
}

/**
 * 语法：let new_array = slice(oldArr, [begin[, end]])
 * 功能：返回一个由 begin 和 end 决定的原数组的浅拷贝，原始数组不会被改变
 * @param {Array} arr 数组
 * @param {Number} begin 开始下标
 * @param {Number} end 结束下标
 * @returns 
 */
export function slice(arr, begin, end) {
  // 若 arr 数组长度为 0
  if (arr.length === 0) return [];
  // 判断是否有无 begin 这个参数，有则用，无则从 0开始
  begin = begin || 0;
  // 如果 begin 越界，则返回空数组
  if (begin >= arr.length) return [];

  // 判断 end 是否存在
  end = end || arr.length;
  // 如果 end 小于 begin，则等于数组长度
  if (end < begin) {
    end = arr.length;
  }
  
  // 声明一个空数组
  const result = [];
  // 遍历数组，将 begin 到 end 之间的元素 push 进 result
  for (let i = 0; i < arr.length; i++) {
    if (i >= begin && i < end) {
      result.push(arr[i])
    }
  }
  return result;
}